from fastapi import APIRouter, status, Query, Depends
from app.modules.users.models import UserModel
from app.modules.users.schemas import (
    LoginForm, UserInfo, UserCreateInput, UserCreatedResponse, UserUpdate, UserListResponse, Token
)
from app.modules.users.services import UserService
from app.core.responses import success_response, error_response
from app.core.security import verify_password, create_access_token
from app.core.exceptions import BusinessException
from app.core.dependencies import get_current_user

# 为所有用户相关的接口统一添加依赖项，除了登录接口
# 注意：登录接口需要单独定义在一个不同的 router 中，或者不包含在这个 router 的保护范围内
# 但为了简化，我们在这里演示一个统一添加，然后单独处理登录接口的方式
router = APIRouter(
    prefix="/api/users", 
    tags=["用户管理"],
    dependencies=[Depends(get_current_user)]
)

# 为了让登录接口不受保护，我们创建一个新的 router
public_router = APIRouter(
    prefix="/api/users",
    tags=["用户管理"]
)

@public_router.post("/login", summary="用户登录", response_model=Token)
async def login(item: LoginForm):
    # 获取用户信息
    user = await UserService.get_by_username(item.username)

    # 检查用户是否存在或密码是否正确
    if not user:
        raise BusinessException(message="用户名或密码错误")
    
    if not verify_password(item.password, user.password):
        raise BusinessException(message="用户名或密码错误")
    
    # 创建 access token
    access_token = create_access_token(
        data={"sub": user.username}
    )
    
    return success_response(
        data={"access_token": access_token, "token_type": "bearer"},
        message="登录成功"
    )

@router.post("/", summary="创建用户", response_model=UserCreatedResponse)
async def create_user(user_in: UserCreateInput, current_user: UserModel = Depends(get_current_user)):
    """
    由管理员创建一个新用户。
    - **username**: 用户名
    - **password**: 密码
    - 需要管理员权限（这里我们暂时只检查登录）
    """
    # 可以在这里添加权限检查，例如： if not current_user.is_superuser: ...
    result = await UserService.create_user(user_in)
    return success_response(
        data=result,
        message="用户创建成功",
        code=status.HTTP_201_CREATED
    )

@router.get("/", summary="获取用户列表", response_model=UserListResponse)
async def get_user_list(
    page: int = Query(1, ge=1, description="页码"),
    size: int = Query(10, ge=1, le=100, description="每页数量")
):
    """获取用户分页列表"""
    total, items = await UserService.get_user_list(skip=(page - 1) * size, limit=size)
    return success_response(data={"total": total, "items": items})

@router.patch("/{user_id}", summary="更新用户信息", response_model=UserInfo)
async def update_user(user_id: int, user_in: UserUpdate):
    """
    更新用户的昵称或邮箱。
    - 只会更新传入的字段。
    """
    result = await UserService.update_user(user_id, user_in)
    return success_response(data=result, message="更新成功")

@router.delete("/{user_id}", summary="删除用户")
async def delete_user(user_id: int):
    """通过用户ID删除用户"""
    await UserService.delete_user(user_id)
    return success_response(message="删除成功")
